package com.atguigu.day4;

import java.lang.invoke.VarHandle;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

//资源类
class MyCache {
    volatile Map<String, String> map = new HashMap();
    //    Lock lock = new ReentrantLock();
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    public void write(String key, String value) {
        lock.writeLock().lock();
        try {
            System.out.println(Thread.currentThread().getName() + "线程\t开始写入");
            map.put(key, value);
            System.out.println(Thread.currentThread().getName() + "线程\t结束写入");
        } finally {
            lock.writeLock().unlock();
        }

    }


    public void read(String key) {
        lock.readLock().lock();
        String rs = null;
        try {
            System.out.println(Thread.currentThread().getName() + "线程\t开始读取");
            rs = map.get(key);
            System.out.println(Thread.currentThread().getName() + "线程\t结束读取" + rs);
        } finally {
            lock.readLock().unlock();
        }

    }
}
/*
 * 读写锁
 *
 * 多于同一个资源，我们涉及多线程的操作，有读，有写，交替进行。
 * 为了保证读写的数据一致性
 *
 * 读    读   可共享
 * 读    写   不共享
 * 写    写   不共享
 * 读的时候希望高并发同时进行，可以共享，多个线程可以同时进行读操作
 * 写的时候为了保证数据的一致性，需要独占排它锁
 *
 * */


//题目：5个线程读、五个线程写入，操作同一个资源
//加ReentrantLock锁 写控制了，但是并没有并发读，并发性能不好
//加ReentrantReadWriteLock   多线程独占写入，且可并发读取
public class ReadWriteLockDemo {
    public static void main(String[] args) {
        MyCache myCache = new MyCache();

        for (int i = 1; i <= 5; i++) {
            new Thread(() -> {
                myCache.write("姓名", "程峥");
            }, String.valueOf("t" + i)).start();
        }


        for (int i = 1; i <= 5; i++) {
            new Thread(() -> {
                myCache.read("姓名");
            }, String.valueOf("t" + i)).start();
        }

    }

}
